<?php

class System {

  private $_url;
  private $_explode;
  public $_controller;
  public $_action;
  public $_params;

  public function __construct() {
    $this->setUrl();
    $this->setExplode();
    $this->setController();
    $this->setAction();
    $this->setParams();
  }

  /**
   * Função para pegar url passada pelo .htaccess. Passa o valor da url para a variavel privada $_url
   * @access private
   * @return void
   */
  private function setUrl() {
    $_GET['url'] = (isset($_GET['url']) ? $_GET['url'] : controller_default() . '/index');
    $this->_url = $_GET['url'];
  }

  /**
   * Função para dividir a variavel $_url onde tiver / . O resultado é passado para variavel $_explode
   * @access private
   * @return void
   */
  private function setExplode() {
    $this->_explode = explode("/", $this->_url);
  }

  /**
   * Função para pegar o controller solicitado. Pega a primeira posição do vetor $_explode e atribui a variavel $_controler
   * @access private
   * @return void
   */
  private function setController() {
    $this->_controller = $this->_explode[0] . 'Controller';
  }

  /**
   * Função para pegar a action solicitada. Pega a segunda posição do vetor $_explode e atribui a variavel $_action.
   * Caso não exista atribui o valor index
   * @access private
   * @return void
   */
  private function setAction() {
    $this->_action = (!isset($this->_explode[1]) || $this->_explode[1] == null ? "index" : $this->_explode[1]);
  }

  /**
   * Função para pegar os parametros passado pela url
   * @access private
   * @return void
   */
  private function setParams() {
    /* deleta o primeiro e o segundo indice da variavel $this->_explode */
    unset($this->_explode[0], $this->_explode[1]);
    /* verifica se o ultimo valor do vetor é nulo */
    if (end($this->_explode) == null)
    /* Se o ultimo valor for nulo o indice é removido */
      array_pop($this->_explode);
    $i = 0;
    /* verifica se $this->_explode NÃO é nulo */
    if (!empty($this->_explode)) {
      foreach ($this->_explode as $val) {
        /* Verifica se o valor passado corresponde ao $i par ou Impar. Se par a variavel $ind recebe o valor, se não a variavel $value recebe o valor */
        if ($i % 2 == 0)
          $ind[] = $val;
        else
          $value[] = $val;
        $i++;
      }
    }else {
      $ind = array();
      $value = array();
    }
    /* Verifica se a quantidade de $ind é igual a de $value e se nenhum é nulo */
    if (count($ind) == count($value) && !empty($ind) && !empty($value)) {
      /* Se as condicoes forem aceita ele cria um array com o valor de $ind como indice e $value como valor do vetor */
      $this->_params = array_combine($ind, $value);
    } else {
      $this->_params = array();
    }
  }

  /**
   * Função retorna os parametros passado na url
   * @param $name //nome do indice que se quer o valor, caso nada seje passado ira retornar um array com todos os valores e indices
   * @access public
   * @return array()
   */
  public function getParams($name = null) {
    if ($name == null) {
      return $this->_params;
    } else {
      return $this->_params[$name];
    }
  }

  /**
   * Verifica e executa o controller e a action Solicitada
   * @access public
   * @return void
   */
  public function run() {
    $controller_path = CONTROLLERS . $this->_controller . '.php';
    /* Verifico se o arquivo existe */
    if (!file_exists($controller_path)) {
      die('Houve um erro! O controle nao existe.');
    }
    require_once($controller_path);
    /* Instancio a classe correspondente ao controller solicitado */
    $app = new $this->_controller();
    /* Verifico se o metodo solicitado existe */
    if (!method_exists($app, $this->_action)) {
      die('Houve um erro a action nao existe');
    }
    $action = $this->_action;
    /* Executo o metodo solicitado */
    $app->$action();
  }

  public function toArray($array, $index = 0) {
    if($array != null ) {
      foreach($array[$index] as $key => $value) {
        $rows[$key] = $value;
      }
      return $rows;
    }
    return $array;
  }

}

?>